package game.model;

import java.awt.Color;
import java.util.HashSet;
import java.util.Set;

/**
 * Clase que representa un Destino.
 * 
 */

public class Destino extends Componente {
	private Color color;
	
	/**
	 * Constructor de la clase destino
	 * 
	 * @param color color del destino
	 */
	
	public Destino(Color color) {
		this.color = color;
		setImagen(2);
	}
	
	public Color getColor() {
		return color;
	}
	
	@Override
	public Set<Rayo> getSalida(Rayo entrada){
		Set<Rayo> salida = new HashSet<Rayo>();
		Rayo rayoSalida = new Rayo(entrada.getColor(), entrada.getOrientacion());
		salida.add(rayoSalida);
		return salida;
	}

	@Override
	public String salvarEstado(String ubicacion) {
		return ubicacion + "2" + "," + "0" + "," + color.getRed() + "," + color.getGreen() + "," + color.getBlue();
	}
	
	@Override
	public Set<Rayo> getSalida(Rayo entrada, Set<Rayo> anterior) {
		Set<Rayo> auxiliarNuevo = new HashSet<Rayo>();
		Set<Rayo> auxiliarAnterior = new HashSet<Rayo>();
		
		auxiliarAnterior.addAll(anterior);
		
		auxiliarNuevo.addAll(getSalida(entrada));
		
		for(Rayo rayoAnt : auxiliarAnterior){
			for(Rayo rayoNuevo : auxiliarNuevo){
				if(rayoAnt.getOrientacion()%2 == rayoNuevo.getOrientacion()%2 && !rayoAnt.mismoColor(rayoNuevo)){
					anterior.remove(rayoAnt);
				}
			}
		}
		
		anterior.addAll(getSalida(entrada));
		
		return getSalida(entrada);
	}
	
	/**
	 * Retorna un boolean que representa si el destino esta siendo tocado
	 * por un rayo de su mismo color. Utilizado para saber en que momento
	 * se gana un nivel
	 * 
	 * @param incidentes rayos que inciden sobre la celda.
	 * @return boolean true si esta tocado por un rayo de su color, false 
	 * en caso contrario.
	 */
	
	public boolean estaTocado(Set<Rayo> incidentes) {
		for(Rayo rayo: incidentes) {
			if(rayo.getColor().equals(this.color)) {
				return true;
			}
		}
		return false;
	}

}
